/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package filer;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import jp.sf.orangesignal.csv.Csv;
import jp.sf.orangesignal.csv.CsvConfig;
import jp.sf.orangesignal.csv.handlers.ColumnNameMapListHandler;

/**
 *
 * @author maggie
 */
public class CsvFile implements Iterator{
	
	private CsvConfig csvConf;
	private List<Map<String, String>> handler;
	private int handlerIndex;
	
	public CsvFile(String filePath) throws IOException {
		this.csvConf = new CsvConfig();
		this.csvConf.setQuoteDisabled(false);                         // デフォルトでは無効となっている囲み文字を有効にします。
		this.csvConf.setEscapeDisabled(false);                        // デフォルトでは無効となっているエスケープ文字を有効にします。
		this.csvConf.setBreakString("\n");                            // 項目値中の改行を \n で置換えます。
		this.csvConf.setNullString("NULL");                           // null 値扱いする文字列を指定します。
		this.csvConf.setIgnoreLeadingWhitespaces(true);               // 項目値前のホワイトスペースを除去します。
		this.csvConf.setIgnoreTrailingWhitespaces(true);              // 項目値後のホワイトスペースを除去します。
		this.csvConf.setIgnoreEmptyLines(true);                       // 空行を無視するようにします。
		this.csvConf.setIgnoreLinePatterns(Pattern.compile("^#.*$")); // 正規表現による無視する行パターンを設定します。(この例では # で始まる行)
		//this.csvConf.setSkipLines(1);                                 // 最初の1行目をスキップして読込みます。
		
		this.handler = Csv.load(new File(filePath), this.csvConf, new ColumnNameMapListHandler());
		this.handlerIndex = 0;
	}
	
	public int flash(String filePath) throws IOException {
		
		Csv.save(this.handler, new File(filePath), this.csvConf, new ColumnNameMapListHandler());
		return this.handler.size();
	}
	
	//public Map

	@Override
	public boolean hasNext() {
		if(this.handlerIndex < this.handler.size()) {
			return true;
		} else {
			return false;
		}
	}

	@Override
	public Object next() {
		Map<String, String> result;
		result = this.handler.get(this.handlerIndex);
		this.handlerIndex++;
		return result;
	}

	@Override
	public void remove() {
		throw new UnsupportedOperationException("Not supported yet.");
	}
	
	public int update(Map<String, String> values) {
		this.handler.remove(this.handlerIndex - 1);
		this.handler.add(this.handlerIndex - 1, values);
    	return 1;	
	}
}
